package com.company.controller;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class ResponseController {
    /*
    * 方式一：使用 HttpServletResponse 类设置响应数据。虽然灵活，但是不推荐日常业务使用！
    * */
    @RequestMapping("/response")
    public void responseData(HttpServletResponse response) throws IOException {
        // 设置响应状态码（一般不需要手动设置）
        response.setStatus(HttpServletResponse.SC_OK);
        // 设置响应头
        response.setHeader("name", "jwy");
        // 设置响应类型 + 编码，防止乱码
        /*
        * 常用的有：
        * 普通文本	text/plain;charset=UTF-8
        * HTML页面	text/html;charset=UTF-8
        * JSON数据	application/json;charset=UTF-8
        * */
        response.setContentType("text/plain;charset=UTF-8");
        // 设置响应体（响应的数据）
        // 需要通过 IO流写入数据，因此有两种写入数据的方式：1.getWrite(): 字符流数据 2.getOutputStream(): 字节流数据
        response.getWriter().write("这是响应给浏览器的数据");
    }

    /*
     * 方式二：使用 @ResponseBody（在 Controller方法上使用该注解） 与 @RestController（将整个类上使用该注解）
     * Spring 会自动将方法返回的对象通过配置的 HttpMessageConverters 转换成指定格式，并写入 HTTP 响应体。
     * */
    @RequestMapping("/response2")
    public String responseData2() {
        return "这是通过 @ResponseBody 或 @RestController 注解响应给浏览器的数据";
    }

    /*
     * 方式三：使用 ResponseEntity<T> 类设置响应数据。
     * 其中，泛型 T 表示响应体中数据的类型
     * */
    @RequestMapping("/response3")
    public ResponseEntity<String> responseData3() {
        // HttpHeaders是Spring框架中用来封装 HTTP 头信息的一个类
        HttpHeaders headers = new HttpHeaders();
        headers.add("name", "666");
        return ResponseEntity.status(HttpStatus.OK).headers(headers).body("这是通过ResponseEntity<T>类响应的数据");
    }
}
